var http = require('http');
var mysql = require('mysql');

// 和 yieldFile 中的 helper 相比，这里添加第二个参数 _this，用户设置 fn 内的 this；
// 比如查询操作，connection(.prototype).query(sql, callback); 内部用到 this.config.xxx;
// 使用使用 mysqlhelper 操作 connection.query，得到的是一个普通的函数 query11，
// query11(sql); 执行时，内部的 this === global，导致报错；
var mysqlhelper = function(fn, _this) {
  // 用于存储回调函数，该函数复用于所有用于helper处理的异步函数
  var feed;
  return function aaa(){
    var args = [].slice.call(arguments);

    args.push(function ddd(){
      if(feed) {
        // console.log(feed); // [Function: ccc]
        feed.apply(null,arguments);
      }
      //console.log(feed)
    });
    fn.apply(_this, args);
    // console.log('fn执行中');
    // 返回一个函数，用于给yield之前的变量赋值
    return function bbb(fn){
      feed = fn;
    }
  }
};

var flow = function(gfn) {
  var generator = gfn();
  next();

  function next(data){
    // console.log('next--data');
    // console.log(typeof data);
    generator.ret = generator.next(data);
    // console.log(generator.ret);
    // console.log(generator.ret.value);// [Function: bbb]
    if(generator.ret.done){
      return;
    }
    generator.ret.value(
      function ccc(error,d){
        // console.log('ccc');
        if(error)
          throw error;
        // console.log('error', error);
        // console.log('d', d);
        next.apply(null,[].slice.call(arguments,1));
      }
    );
  }
};

// console.log(global);

http.createServer(function (request, response) {
  if (request.url.indexOf('favicon') > -1) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end('Hello World\n');
  } else {    
    var connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'root',
      password : 'root',
      database : 'graco'
    });
    // console.log(connection); // Connection 对象；
     
    connection.connect();
    // console.log(connection.config); ConnectionConfig 对象；

    // 一般执行，start；

    // connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
    //   if (error) throw error;
    //   console.log('The solution is: ', results[0].solution);
    //   // console.log(fields);
    // });
    // console.log('111');

    // connection.query('SELECT account_id,appid,appsecret,token from wp_account', function (error, results, fields) {
    //   if (error) throw error;
    //   console.log(results);
    //   // console.log(fields);
    // });
    // console.log('222');

    // connection.query('SELECT material_id,server_url from wp_material', function (error, results, fields) {
    //   if (error) throw error;
    //   console.log('results');
    //   // console.log(fields);
    // });
    // console.log('333');

    // connection.query('SELECT 1 + 2 AS solution', function (error, results, fields) {
    //   if (error) throw error;
    //   console.log('The solution is: ', results[0].solution);
    //   // console.log(fields);
    // });
    // console.log('444');

    // connection.query('SELECT account_id,appid,appsecret,token from wp_account', function (error, results, fields) {
    //   if (error) throw error;
    //   console.log(results);
    //   // console.log(fields);
    // });
    // console.log('555');

    // 一般执行，end；
    /*
    首先连续 111 ~ 555，
    后面是执行每个回调，而且是从第一个回调依次到最后一个回调，这个和 mysql 耗时好像没有关系；
    比如 第三个sql 耗时应该是比 account 和 solution 两个要长的，因为里面数据很多，
    但是，反复请求，执行顺序都是一样的，从第一个回调依次到最后一个回调
     */ 
    

    // 下面不能加 yield，否则报错：SyntaxError: Unexpected identifier（指的是 connection）
    //let aa = connection.query('SELECT 1 + 1 AS solution');
    //console.log(aa);// 不加 yield 情况下，aa 是 Query 对象。

    
    // 使用 mysqlhelper 包装成同步；
    flow(function* (){
      // console.log(connection);
      // console.log(connection.config);
      let query11 = mysqlhelper(connection.query, connection);      
      let aa = yield query11('SELECT 1 + 1 AS solution');
      console.log(aa);

      aa = yield query11('SELECT account_id,appid,appsecret,token from wp_account');
      console.log(aa);
    });


    // 发送 HTTP 头部 
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});
    // 发送响应数据 "Hello World"
    response.end('Hello World\n');
  }
}).listen(8888);

// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');

